<?php

require_once(dirname(__FILE__).'/../proto/GcBaseFilter.class.php');
require_once(dirname(__FILE__).'/../GcFilters.class.php');

/**
 * Klasa implementująca handler do generowania zapytań, filtrujących produkty
 * względem aktywnych filtrów
 *  
 * @author strange3studio
 *
 */
class GcFiltrationHandler {
  
	// instancja klasy GcFilters
  private $gcFilters; 
  
  // grupa, dla której wywołujemy filtrowanie
  private $_group;
  

  
  private function prepareSelectStatement() {
    
  	return "CREATE TEMPORARY TABLE gc_filtration_temp_table(nid integer , INDEX(nid)) Engine=MEMORY SELECT n.nid FROM {node} n ";
  	
  }
  
  private function prepareJoinStatement() {

  	$activeFilters = $this->gcFilters->getActiveFilters();
  	$tables = array();
  	
  	foreach($activeFilters as $activeFilter) {

  		$table = $activeFilter->getFilterDatabaseQuery('join');
      // każdy aktywny filtr zwraca odpowiednią dla siebie część zapytania

      // sprawdzamy czy ten filtr dał jakąś odpowiedź
      if($table) {        
      	$tables[] = $table;
      }
      
    }

    // usuwamy powtarzające się nazwy tabel    
    $tables = array_unique($tables);
    
    // tworzymy string
    $output = '';
    foreach($tables as $table) {
    	$output .= " RIGHT JOIN {".$table."} as ".$table." ON n.nid = ".$table.".nid 
    	";
    }
    
    return $output; 
  }
    
  
  private function prepareQueryStatement($op,$delimiter) {
    

    // pobieramy odpowiedzi od wszystkich aktywnych filtrów
    $responces = $this->getActiveFiltersResponces($op);
    
    // dodajemy do zapytania $op, jeśli tylko mamy do cvzego
    if(count($responces)) {
    	$query = ' '.$delimiter.' ';
    }
    
    $query .= implode(" ".$delimiter." ", $responces);
    
    return $query;
  }
  
  private function getActiveFiltersResponces($op) {
    $responces = array();    
    
    $activeFilters = $this->gcFilters->getActiveFilters();
   
    foreach($activeFilters as $activeFilter) {
      // każdy aktywny filtr zwraca odpowiednią dla siebie część zapytania
      $responce =  $activeFilter->getFilterDatabaseQuery($op);
      // sprawdzamy czy ten filtr dał jakąś odpowiedź
      if($responce) {
        $responces[] = $responce;
      }
    }
    return $responces;
  }
  
 private function prepareOrderByStatement() {
    
    
    // pobieramy listę aktywnych filtrów (znajdujących się w ścieżce)
   
    $responces = $this->getActiveFiltersResponces('order by');
    
    // dodajemy do zapytania $op, jeśli tylko mamy do cvzego
    if(count($responces)) {
      $query = " ORDER BY ";
    }
    
    $query .= implode(' , ' , $responces);
    
    return $query;
  }
  
 
  private function prepareQueryValues() {
  	$queryValues = array();
  	
  	// najpierw dokładamy nidy, które podlegają filtracji
  	//$queryValues = $this->_group->products_nids;
  	
  	$activeFilters = $this->gcFilters->getActiveFilters();
  	
    foreach($activeFilters as $activeFilter) {
    	
      // każdy aktywny filtr zwraca odpowiednią dla siebie część zapytania "WHERE ..."

    	$activeFilterValue = $activeFilter->getFilterDatabaseQuery('value');
    	if($activeFilterValue) {
        $queryValues = array_merge($queryValues,array($activeFilterValue));
    	}
      
    }
    return $queryValues;
    
  }
  
  private function finalizeQuery() {
  	return ';';
  }
  
  private function prepareBaseWhereQuery() {
  	$query = '';
  	$query .= " WHERE 1";//n.nid IN (".db_placeholders($this->_group->products_nids).") ";
  	return $query;
  }
  
  public function prepareFiltrationQuery() {
    $output = '';
    
    $output .= $this->prepareSelectStatement();
    $output .= $this->prepareJoinStatement();
    $output .= $this->prepareBaseWhereQuery();
    $output .= $this->prepareQueryStatement('where','AND');    
    $output .= $this->prepareOrderByStatement();  
    return $output;  
  }
  
  public function prepareFiltrationQueryValues() {
  	return $this->prepareQueryValues();
  }
 
  public function prepareTemporaryTable() {
  	$filtrationQuery = $this->prepareFiltrationQuery();
    $filtrationValues = $this->prepareFiltrationQueryValues(); 
  	db_query($filtrationQuery,$filtrationValues);
  }
  /**
   * @param Object $group
   *  obiekt zawierajćy grupę katalogu, dla którego chcemy przeprowadzić filtrowanie 
   * @return unknown_type
   */
  public function __construct(&$group) {
     $this->gcFilters = new GcFilters(); 
     $this->_group = &$group;
  }
  
}
